package com.aviator.executor;

import com.googlecode.aviator.AviatorEvaluator;
import com.googlecode.aviator.Options;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author: Jiangxx
 * @Date: 2021/12/30
 * @Description: 强大的seq库：aviator 拥有强大的操作集合和数组的 seq 库。整个库风格类似函数式编程中的高阶函数。
 * 在 aviator 中, 数组以及java.util.Collection下的子类都称为seq,可以直接利用 seq 库进行遍历、过滤和聚合等操作。
 */
public class AviatorExecutor11 {


    public static void main(String[] args) throws FileNotFoundException {

        /**
         * 我们可以:
         *
         * ● 求长度: count(list)
         * ● 求和: reduce(list,+,0), reduce函数接收三个参数,第一个是seq,第二个是聚合的函数,如+等,第三个是聚合的初始值
         * ● 过滤: filter(list,seq.gt(9)), 过滤出list中所有大于9的元素并返回集合; seq.gt函数用于生成一个谓词,表示大于某个值
         * ● 判断元素在不在集合里: include(list,10)
         * ● 排序: sort(list)
         * ● 遍历整个集合: map(list,println), map接受的第二个函数将作用于集合中的每个元素,这里简单地调用println打印每个元素
         *
         * 其他还有：
         *
         * ● seq.some(list, pred) 当集合中只要有一个元素满足谓词函数 pred 返回 true，立即返回 true，否则为 false。
         * ● seq.every(list, pred) 当集合里的每个元素都满足谓词函数 pred 返回 true，则结果为 true，否则返回 false。
         * ● seq.not_any(list, pred)，当集合里的每个元素都满足谓词函数 pred 返回 false，则结果为 true，否则返回 false。
         *
         * 以及 seq.or(p1, p2, ...) 和 seq.and(p1, p2, ...) 用于组合 seq.gt、seq.lt 等谓词函数。
         */
        Map<String, Object> env = new HashMap<String, Object>();
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(3);
        list.add(20);
        list.add(10);
        env.put("list", list);
        Object result = AviatorEvaluator.execute("count(list)", env);
        System.out.println(result);  // 3
        result = AviatorEvaluator.execute("reduce(list,+,0)", env);
        System.out.println(result);  // 33
        result = AviatorEvaluator.execute("filter(list,seq.gt(9))", env);
        System.out.println(result);  // [10, 20]
        result = AviatorEvaluator.execute("include(list,10)", env);
        System.out.println(result);  // true
        result = AviatorEvaluator.execute("sort(list)", env);
        System.out.println(result);  // [3, 10, 20]
        AviatorEvaluator.execute("map(list,println)", env);

        /**
         * 两种运行模式：默认 AviatorEvaluator 以执行速度优先:
         * AviatorEvaluator.setOption(Options.OPTIMIZE_LEVEL, AviatorEvaluator.EVAL);
         * 可以修改为编译速度优先,这样不会做编译优化:
         * AviatorEvaluator.setOption(Options.OPTIMIZE_LEVEL, AviatorEvaluator.COMPILE);
         */

        AviatorEvaluator.setOption(Options.OPTIMIZE_LEVEL, AviatorEvaluator.EVAL);

        AviatorEvaluator.setOption(Options.OPTIMIZE_LEVEL, AviatorEvaluator.COMPILE);

        /**
         * 调试信息:如果想查看每个表达式生成的字节码，可以通过打开 Trace 选项：
         *     import com.googlecode.aviator.Options;
         *     ......
         *     AviatorEvaluator.setOption(Options.TRACE, true);
         * 默认是打印到标准输出,你可以改变输出指向:
         * AviatorEvaluator.setTraceOutputStream(new FileOutputStream(new File("aviator.log")));
         */
        AviatorEvaluator.setOption(Options.TRACE, true);

        AviatorEvaluator.setTraceOutputStream(new FileOutputStream(new File("aviator.log")));

    }
}
